import 'package:flutter/cupertino.dart';
import 'package:netease_cloud_music_api/netease_cloud_music_api.dart';
import 'package:netease_cloud_music_api/utils/request.dart';

mixin DjRadio {
  /// 电台 - banner
  /// 说明 : 调用此接口,可获取电台banner
  Future<PlayerRequestResponse> djRadioBanner() {
    return PlayerRequest(
      url: 'https://music.163.com/weapi/djradio/banner/get',
      options: PlayerRequestOptions(
          method: PlayerRequestMethod.post,
          crypto: EncryptType.weapi,
          cookie: 'os=pc'
      ),
    ).request();
  }

  /// 电台 - 非热门类型
  /// 说明 : 登录后调用此接口, 可获得电台非热门类型
  Future<PlayerRequestResponse> djRadioCategoryExcludeHot() {
    return PlayerRequest(
      url: 'https://music.163.com/weapi/djradio/category/excludehot',
      options: PlayerRequestOptions(
          method: PlayerRequestMethod.post,
          crypto: EncryptType.weapi,
      ),
    ).request();
  }

  /// 电台 - 推荐类型
  /// 说明 : 登录后调用此接口, 可获得电台推荐类型
  Future<PlayerRequestResponse> djRadioCategoryRecommend() {
    return PlayerRequest(
      url: 'https://music.163.com/weapi/djradio/home/category/recommend',
      options: PlayerRequestOptions(
        method: PlayerRequestMethod.post,
        crypto: EncryptType.weapi,
      ),
    ).request();
  }

  /// 电台 - 分类
  /// 说明 : 登录后调用此接口 , 可获得电台类型
  Future<PlayerRequestResponse> djRadioCateList() {
    return PlayerRequest(
      url: 'https://music.163.com/weapi/djradio/category/get',
      options: PlayerRequestOptions(
        method: PlayerRequestMethod.post,
        crypto: EncryptType.weapi,
      ),
    ).request();
  }

  /// 电台 - 详情
  /// 说明 : 登录后调用此接口 , 传入 [rid] , 可获得对应电台的详情介绍
  /// [rid] 必选参数, 电台的id
  Future<PlayerRequestResponse> djRadioDetail({ required int rid }) {
    return PlayerRequest(
      url: 'https://music.163.com/api/djradio/v2/get',
      data: { 'id': rid },
      options: PlayerRequestOptions(
        method: PlayerRequestMethod.post,
        crypto: EncryptType.weapi,
      ),
    ).request();
  }

  /// 电台 - 热门
  /// 说明 : 调用此接口,可获取热门电台
  /// [limit] 返回数量 , 默认为 30
  /// [offset] 偏移数量，用于分页 , 如 :(页数 - 1)*30, 其中 30 为 [limit] 的值 , 默认为 0
  Future<PlayerRequestResponse> djRadioHot({ int? limit, int? offset }) {
    return PlayerRequest(
      url: 'https://music.163.com/weapi/djradio/hot/v1',
      data: { 'limit': limit ?? 30, 'offset': offset ?? 0 },
      options: PlayerRequestOptions(
        method: PlayerRequestMethod.post,
        crypto: EncryptType.weapi,
      ),
    ).request();
  }

  /// 电台 - 付费精选
  /// 说明 : 可以获取付费精选的电台列表 , 传入 [limit] 和 [offset] 可以进行分页
  /// [limit] 返回数量 , 默认为 30
  /// [offset] 偏移数量，用于分页 , 如 :(页数 - 1)*30, 其中 30 为 [limit] 的值 , 默认为 0
  Future<PlayerRequestResponse> djRadioPayGift({ int? limit, int? offset }) {
    return PlayerRequest(
      url: 'https://music.163.com/weapi/djradio/home/paygift/list?_nmclfl=1',
      data: { 'limit': limit ?? 30, 'offset': offset ?? 0 },
      options: PlayerRequestOptions(
        method: PlayerRequestMethod.post,
        crypto: EncryptType.weapi,
      ),
    ).request();
  }

  /// 电台 - 个性推荐
  /// 说明 : 调用此接口,可获取电台个性推荐列表, 传入 [limit] 和 [offset] 可以进行分页
  /// [limit] 返回数量 , 默认为 30
  /// [offset] 偏移数量，用于分页 , 如 :(页数 - 1)*30, 其中 30 为 [limit] 的值 , 默认为 0
  Future<PlayerRequestResponse> djRadioPersonalizeRecommend({ int? limit, int? offset }) {
    return PlayerRequest(
      url: 'https://music.163.com/api/djradio/personalize/rcmd',
      data: { 'limit': limit ?? 30, 'offset': offset ?? 0 },
      options: PlayerRequestOptions(
        method: PlayerRequestMethod.post,
        crypto: EncryptType.weapi,
      ),
    ).request();
  }

  /// 电台 - 节目详情
  /// 说明 : 调用此接口传入电台节目id,可获得电台节目详情
  /// [rid] 电台节目 的 id
  Future<PlayerRequestResponse> djRadioProgramDetail({ required int rid }) {
    return PlayerRequest(
      url: 'https://music.163.com/api/dj/program/detail',
      data: { 'id': rid },
      options: PlayerRequestOptions(
        method: PlayerRequestMethod.post,
        crypto: EncryptType.weapi,
      ),
    ).request();
  }

  /// 电台 - 24小时节目榜
  /// 说明 : 调用此接口,可获取24小时节目榜
  /// [limit] 返回数量 , 默认为 30
  /// [offset] 偏移数量，用于分页 , 如 :(页数 - 1)*30, 其中 30 为 [limit] 的值 , 默认为 0
  Future<PlayerRequestResponse> djRadioProgramTopListHot({ int? limit, int? offset }) {
    return PlayerRequest(
      url: 'https://music.163.com/api/djprogram/toplist/hours',
      data: { 'limit': limit ?? 30, 'offset': offset ?? 0 },
      options: PlayerRequestOptions(
        method: PlayerRequestMethod.post,
        crypto: EncryptType.weapi,
      ),
    ).request();
  }

  /// 电台 - 节目榜
  /// 说明 : 登录后调用此接口 , 可获得电台节目榜
  /// [limit] 返回数量 , 默认为 30
  /// [offset] 偏移数量，用于分页 , 如 :(页数 - 1)*30, 其中 30 为 [limit] 的值 , 默认为 0
  Future<PlayerRequestResponse> djRadioProgramTopList({ int? limit, int? offset }) {
    return PlayerRequest(
      url: 'https://music.163.com/api/program/toplist/v1',
      data: { 'limit': limit ?? 30, 'offset': offset ?? 0 },
      options: PlayerRequestOptions(
        method: PlayerRequestMethod.post,
        crypto: EncryptType.weapi,
      ),
    ).request();
  }

  /// 电台 - 节目
  /// 说明 : 登录后调用此接口 , 传入 [rid], 可查看对应电台的电台节目以及对应的 id,
  /// 需要 注意的是这个接口返回的 mp3Url 已经无效 , 都为 null, 但是通过调用 /song/url 这 个接口 ,
  /// 传入节目 id 仍然能获取到节目音频 , 如 /song/url?id=478446370 获取代 码时间的一个节目的音频
  /// [rid] 必选参数, 电台 的 id
  /// [limit] 返回数量 , 默认为 30
  /// [offset] 偏移数量，用于分页 , 如 :(页数 - 1)*30, 其中 30 为 [limit] 的值 , 默认为 0
  /// [asc] 排序方式,默认为 false (新 => 老 ) 设置 true 可改为 老 => 新
  Future<PlayerRequestResponse> djRadioProgram({ required int rid, int? limit, int? offset, bool? asc }) {
    Map<String,dynamic> data = {
      'radioId': rid,
      'limit': limit ??  30,
      'offset': offset ??  0,
      'asc': asc ?? false,
    };
    return PlayerRequest(
      url: 'https://music.163.com/weapi/dj/program/byradio',
      data: data,
      options: PlayerRequestOptions(
        method: PlayerRequestMethod.post,
        crypto: EncryptType.weapi,
      ),
    ).request();
  }

  /// 电台 - 类别热门电台
  /// [cateId] 必选参数, 类别 id,可通过 [djRadioCategoryRecommend] 接口获取
  /// [limit] 返回数量 , 默认为 30
  /// [offset] 偏移数量，用于分页 , 如 :(页数 - 1)*30, 其中 30 为 [limit] 的值 , 默认为 0
  Future<PlayerRequestResponse> djRadioCategoryHot({ required int cateId, int? limit, int? offset, }) {
    Map<String,dynamic> data = {
      'cateId': cateId,
      'limit': limit ??  30,
      'offset': offset ??  0,
    };
    return PlayerRequest(
      url: 'https://music.163.com/api/djradio/hot',
      data: data,
      options: PlayerRequestOptions(
        method: PlayerRequestMethod.post,
        crypto: EncryptType.weapi,
      ),
    ).request();
  }

  /// 电台 - 分类推荐
  /// 说明 : 登录后调用此接口 , 传入分类,可获得对应类型电台列表
  /// [cateId] 必选参数, 类别 id,可通过 [djRadioCateList] 接口获取
  Future<PlayerRequestResponse> djRadioRecommendType({ required int cateId }) {
    Map<String,dynamic> data = {
      'cateId': cateId,
    };
    return PlayerRequest(
      url: 'https://music.163.com/weapi/djradio/recommend',
      data: data,
      options: PlayerRequestOptions(
        method: PlayerRequestMethod.post,
        crypto: EncryptType.weapi,
      ),
    ).request();
  }

  /// 电台 - 推荐
  /// 说明 : 登录后调用此接口 , 可获得推荐电台
  Future<PlayerRequestResponse> djRadioRecommend() {
    return PlayerRequest(
      url: 'https://music.163.com/weapi/djradio/recommend/v1',
      options: PlayerRequestOptions(
        method: PlayerRequestMethod.post,
        crypto: EncryptType.weapi,
      ),
    ).request();
  }

  /// 电台 - 订阅
  /// 说明 : 登录后调用此接口 , 传入rid, 可订阅 dj
  /// [rid] 电台的id
  /// [collect] 是否收藏 true 为收藏，false 为取消收藏
  Future<PlayerRequestResponse> djRadioSub({required bool collect, required int rid}) {
    return PlayerRequest(
      url: 'https://music.163.com/weapi/djradio/${collect ? 'sub' : 'unsub'}',
      data: {'id': rid},
      options: PlayerRequestOptions(
        method: PlayerRequestMethod.post,
        crypto: EncryptType.weapi,
      ),
    ).request();
  }

  /// 电台 - 订阅列表
  /// 说明 : 登录后调用此接口 , 可获取订阅的电台列表
  /// [limit] 返回数量 , 默认为 30
  /// [offset] 偏移数量，用于分页 , 如 :(页数 - 1)*30, 其中 30 为 [limit] 的值 , 默认为 0
  Future<PlayerRequestResponse> djRadioSubList({int? limit, int? offset}) {
    return PlayerRequest(
      url: 'https://music.163.com/weapi/djradio/get/subed',
      data: {'limit': limit ?? 30, 'offset': offset ?? 0, 'total': true},
      options: PlayerRequestOptions(
        method: PlayerRequestMethod.post,
        crypto: EncryptType.weapi,
      ),
    ).request();
  }

  /// 电台 - 订阅者列表
  /// 说明 : 调用此接口,可获取电台订阅者列表
  /// [rid] 电台的id
  /// [limit] 返回数量 , 默认为 30
  /// [time] 分页参数,默认-1,传入上一次返回结果的 time,将会返回下一页的数据
  Future<PlayerRequestResponse> djRadioSubscriber({int? limit, required int rid, int? time}) {
    return PlayerRequest(
      url: 'https://music.163.com/api/djradio/subscriber',
      data: {'limit': limit ?? 30, 'id': rid, 'total': true, 'time': time ?? -1},
      options: PlayerRequestOptions(
        method: PlayerRequestMethod.post,
        crypto: EncryptType.weapi,
      ),
    ).request();
  }

  /// 电台 - 今日优选
  /// 说明 : 登录后调用此接口, 可获得电台今日优选
  Future<PlayerRequestResponse> djRadioTodayPerfered() {
    return PlayerRequest(
      url: 'https://music.163.com/weapi/djradio/home/today/perfered',
      options: PlayerRequestOptions(
        method: PlayerRequestMethod.post,
        crypto: EncryptType.weapi,
      ),
    ).request();
  }

  /// 电台 - 24小时主播榜
  /// 说明 : 调用此接口,可获取24小时主播榜
  /// [limit] 返回数量 , 默认为 30
  Future<PlayerRequestResponse> djRadioTopListHours({int? limit}) {
    return PlayerRequest(
      url: 'https://music.163.com/api/dj/toplist/hours',
      data: {'limit': limit ?? 30},
      options: PlayerRequestOptions(
        method: PlayerRequestMethod.post,
        crypto: EncryptType.weapi,
      ),
    ).request();
  }

  /// 电台 - 主播新人榜
  /// 说明 : 调用此接口,可获取主播新人榜
  /// [limit] 返回数量 , 默认为 30
  /// [offset] 偏移数量，用于分页 , 如 :(页数 - 1)*30, 其中 30 为 [limit] 的值 , 默认为 0
  Future<PlayerRequestResponse> djRadioTopListNewcomer({int? limit, int? offset}) {
    return PlayerRequest(
      url: 'https://music.163.com/api/dj/toplist/newcomer',
      data: {'limit': limit ?? 30, 'offset': offset ?? 0},
      options: PlayerRequestOptions(
        method: PlayerRequestMethod.post,
        crypto: EncryptType.weapi,
      ),
    ).request();
  }

  /// 电台 - 付费精品
  /// 说明 : 调用此接口,可获取付费精品电台
  /// [limit] 返回数量 , 默认为 30
  Future<PlayerRequestResponse> djRadioTopListPay({int? limit}) {
    return PlayerRequest(
      url: 'https://music.163.com/api/djradio/toplist/pay',
      data: {'limit': limit ?? 30},
      options: PlayerRequestOptions(
        method: PlayerRequestMethod.post,
        crypto: EncryptType.weapi,
      ),
    ).request();
  }

  /// 电台 - 最热主播榜
  /// 说明 : 调用此接口,可获取最热主播榜
  /// [limit] 返回数量 , 默认为 30
  Future<PlayerRequestResponse> djRadioTopListPopular({int? limit}) {
    return PlayerRequest(
      url: 'https://music.163.com/api/dj/toplist/popular',
      data: {'limit': limit ?? 30},
      options: PlayerRequestOptions(
        method: PlayerRequestMethod.post,
        crypto: EncryptType.weapi,
      ),
    ).request();
  }

  /// 电台 - 新晋电台榜/热门电台榜
  /// 说明 : 调用此接口,可获取最热主播榜
  /// [typeMap] 榜单类型, [DjRadioTopListType.New] 为新晋电台榜, [DjRadioTopListType.Hot] 为热门电台榜
  /// [limit] 返回数量 , 默认为 30
  /// [offset] 偏移数量，用于分页 , 如 :(页数 - 1)*30, 其中 30 为 [limit] 的值 , 默认为 0
  Future<PlayerRequestResponse> djRadioTopList({ DjRadioTopListType typeMap = DjRadioTopListType.New, int? limit, int? offset }) {
    int type = 0;
    if (typeMap == DjRadioTopListType.New) type = 0;
    if (typeMap == DjRadioTopListType.Hot) type = 1;
    return PlayerRequest(
      url: 'https://music.163.com/api/djradio/toplist',
      data: {'limit': limit ?? 30, 'offset': offset ?? 0, 'type': type},
      options: PlayerRequestOptions(
        method: PlayerRequestMethod.post,
        crypto: EncryptType.weapi,
      ),
    ).request();
  }
}